package com.todo.controller;

import com.todo.service.impl.UserServiceImpl;
import com.todo.utils.PhoneEncryptUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 数据迁移控制器
 * 提供手机号加密迁移等数据迁移功能的REST接口
 * 
 * 注意：此控制器仅用于数据迁移，生产环境中应该限制访问权限
 */
@Slf4j
// @RestController
// @RequestMapping("/api/migration")
public class DataMigrationController {

    @Autowired
    private UserServiceImpl userService;

    @Autowired
    private PhoneEncryptUtil phoneEncryptUtil;

    /**
     * 从配置文件读取是否启用加密功能
     */
    @Value("${phone.encrypt.enabled:true}")
    private boolean encryptEnabled;

    /**
     * 执行手机号加密迁移
     * 将数据库中现有的明文手机号加密存储
     * 
     * @return 迁移结果
     */
    @PostMapping("/encrypt-phones")
    public Map<String, Object> encryptPhones() {
        Map<String, Object> result = new HashMap<>();
        
        try {
            if (!encryptEnabled) {
                result.put("success", false);
                result.put("message", "手机号加密功能未启用");
                return result;
            }

            log.info("开始执行手机号加密迁移...");
            
            // 执行迁移
            userService.migratePhoneEncryption();
            
            result.put("success", true);
            result.put("message", "手机号加密迁移完成");
            
            log.info("手机号加密迁移执行完成");
            
        } catch (Exception e) {
            log.error("手机号加密迁移失败", e);
            result.put("success", false);
            result.put("message", "迁移失败: " + e.getMessage());
        }
        
        return result;
    }

    /**
     * 测试手机号加密解密功能
     * 用于验证加密工具是否正常工作
     * 
     * @param phone 测试用的手机号
     * @return 加密解密测试结果
     */
    @PostMapping("/test-encryption")
    public Map<String, Object> testEncryption(@RequestParam String phone) {
        Map<String, Object> result = new HashMap<>();
        
        try {
            if (!encryptEnabled) {
                result.put("success", false);
                result.put("message", "手机号加密功能未启用");
                return result;
            }

            // 验证手机号格式
            if (phone == null || !phone.matches("^1[3-9]\\d{9}$")) {
                result.put("success", false);
                result.put("message", "手机号格式不正确");
                return result;
            }

            log.info("测试手机号加密解密，手机号: {}", PhoneEncryptUtil.maskPhone(phone));
            
            // 执行加密
            String encrypted = phoneEncryptUtil.encrypt(phone);
            log.debug("加密结果长度: {}", encrypted.length());
            
            // 执行解密
            String decrypted = phoneEncryptUtil.decrypt(encrypted);
            
            // 验证加密解密是否正确
            boolean isValid = phone.equals(decrypted);
            
            result.put("success", isValid);
            result.put("originalPhone", PhoneEncryptUtil.maskPhone(phone));
            result.put("encryptedPhone", encrypted);
            result.put("decryptedPhone", PhoneEncryptUtil.maskPhone(decrypted));
            result.put("isValid", isValid);
            result.put("encryptedLength", encrypted.length());
            
            if (isValid) {
                result.put("message", "加密解密测试成功");
                log.info("手机号加密解密测试成功");
            } else {
                result.put("message", "加密解密测试失败：解密结果不匹配");
                log.error("手机号加密解密测试失败：原始={}, 解密={}", 
                    PhoneEncryptUtil.maskPhone(phone), PhoneEncryptUtil.maskPhone(decrypted));
            }
            
        } catch (Exception e) {
            log.error("手机号加密解密测试失败", e);
            result.put("success", false);
            result.put("message", "测试失败: " + e.getMessage());
        }
        
        return result;
    }

    /**
     * 获取加密配置信息
     * 用于检查当前的加密设置状态
     * 
     * @return 配置信息
     */
    @GetMapping("/encryption-config")
    public Map<String, Object> getEncryptionConfig() {
        Map<String, Object> config = new HashMap<>();
        
        config.put("encryptEnabled", encryptEnabled);
        config.put("algorithm", "AES");
        config.put("transformation", "AES/ECB/PKCS5Padding");
        config.put("keyLength", "256 bits");
        config.put("description", "手机号使用AES-256加密，Base64编码存储");
        
        return config;
    }

    /**
     * 生成新的加密密钥（仅用于开发测试）
     * 生产环境中应该使用专门的密钥管理服务
     * 
     * @return 生成的密钥信息
     */
    @PostMapping("/generate-key")
    public Map<String, Object> generateKey() {
        Map<String, Object> result = new HashMap<>();
        
        try {
            String randomKey = PhoneEncryptUtil.generateRandomKey();
            
            result.put("success", true);
            result.put("key", randomKey);
            result.put("keyLength", randomKey.length());
            result.put("message", "密钥生成成功");
            result.put("warning", "此密钥仅用于开发测试，生产环境请使用专业的密钥管理服务");
            
            log.info("生成新的加密密钥，长度: {}", randomKey.length());
            
        } catch (Exception e) {
            log.error("生成加密密钥失败", e);
            result.put("success", false);
            result.put("message", "密钥生成失败: " + e.getMessage());
        }
        
        return result;
    }

    /**
     * 健康检查接口
     * 验证加密服务是否正常运行
     * 
     * @return 健康状态
     */
    @GetMapping("/health")
    public Map<String, Object> healthCheck() {
        Map<String, Object> health = new HashMap<>();
        
        try {
            // 使用固定的测试手机号进行健康检查
            String testPhone = "13800138000";
            String encrypted = phoneEncryptUtil.encrypt(testPhone);
            String decrypted = phoneEncryptUtil.decrypt(encrypted);
            
            boolean isHealthy = testPhone.equals(decrypted);
            
            health.put("status", isHealthy ? "UP" : "DOWN");
            health.put("encryptEnabled", encryptEnabled);
            health.put("encryptionTest", isHealthy ? "PASS" : "FAIL");
            health.put("timestamp", System.currentTimeMillis());
            
            if (isHealthy) {
                log.debug("手机号加密服务健康检查通过");
            } else {
                log.error("手机号加密服务健康检查失败");
            }
            
        } catch (Exception e) {
            log.error("手机号加密服务健康检查异常", e);
            health.put("status", "DOWN");
            health.put("error", e.getMessage());
            health.put("timestamp", System.currentTimeMillis());
        }
        
        return health;
    }
} 